package in.lib.view; import in.lib.utils.html.ADNHtml; import in.lib.view.spannable.NotUnderlinedClickableSpan; import lombok.Setter; import android.content.Context; import android.text.Layout; import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.text.method.MovementMethod; import android.text.style.ClickableSpan; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.view.ViewConfiguration; public class LinkifiedAutoCompleteTextView extends AutoSuggestView implements OnLongClickListener, OnClickListener { private SpannableStringBuilder mStrBuilder; @Setter private OnSpannableClickedListener onSpannableClickedListener; public interface OnSpannableClickedListener { public void onSpannableClicked(ClickableSpan spannable); } public LinkifiedAutoCompleteTextView(Context context, AttributeSet attrs) { super(context, attrs); } public void setText(String text) { if (!TextUtils.isEmpty(text)) { mStrBuilder = new SpannableStringBuilder(ADNHtml.fromHtml(text)); setText(mStrBuilder); } } public void setLinkMovementMethod(MovementMethod movement) { setMovementMethod(movement); if (movement != null) { setOnLongClickListener(this); //setOnClickListener(this); } } @Override public boolean onTouchEvent(MotionEvent event) { int x = (int)event.getX(); int y = (int)event.getY(); x -= getTotalPaddingLeft(); y -= getTotalPaddingTop(); x += getScrollX(); y += getScrollY(); Layout layout = getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); setSelection(off); /** * get you interest span */ NotUnderlinedClickableSpan[] link = getText().getSpans(off, off, NotUnderlinedClickableSpan.class); if (link.length != 0) { if (event.getAction() == MotionEvent.ACTION_UP) { if (event.getEventTime() - event.getDownTime() <= ViewConfiguration.getTapTimeout()) { if (onSpannableClickedListener != null) { onSpannableClickedListener.onSpannableClicked(link[0]); } link[0].onSimpleClick(this); } } return true; } return super.onTouchEvent(event); } @Override public boolean onLongClick(View v) { if (mStrBuilder != null) { NotUnderlinedClickableSpan[] spans = mStrBuilder.getSpans(getSelectionStart(), getSelectionEnd(), NotUnderlinedClickableSpan.class); if (spans.length == 1) { NotUnderlinedClickableSpan span = spans[0]; span.onLongClick(v); return true; } } return false; } @Override public void onClick(View v) { if (mStrBuilder != null) { NotUnderlinedClickableSpan[] spans = mStrBuilder.getSpans(getSelectionStart(), getSelectionEnd(), NotUnderlinedClickableSpan.class); if (spans.length > 0) { NotUnderlinedClickableSpan span = spans[0]; span.onSimpleClick(v); } } } }